vulkan: Push the correct matrix when drawing
authorBenjamin Otte <otte@redhat.com>
Fri, 9 Dec 2016 04:53:04 +0000 (05:53 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 9 Dec 2016 17:35:52 +0000 (18:35 +0100)
Instead of pushing the root matrix, push the world matrix for the
current node. That way, the bounds we emit as vertices are actually
properly transformed.

gsk/gskvulkanrender.c
gsk/gskvulkanrenderpass.c
gsk/gskvulkanrenderpassprivate.h

index 626f6389cccde90652316da768618e584ccfd06d..12b390d195a67a954efce16089b174dfe66cac11 100644 (file)
@@ -437,16 +437,9 @@ gsk_vulkan_render_draw (GskVulkanRender   *self,
                           },
                           (VkDeviceSize[1]) { 0 });
 
-  vkCmdPushConstants (self->command_buffer,
-                      gsk_vulkan_pipeline_get_pipeline_layout (self->pipeline),
-                      VK_SHADER_STAGE_VERTEX_BIT,
-                      0,
-                      sizeof (graphene_matrix_t),
-                      &self->mvp);
-
   for (l = self->render_passes; l; l = l->next)
     {
-      gsk_vulkan_render_pass_draw (l->data, self, self->pipeline, self->command_buffer);
+      gsk_vulkan_render_pass_draw (l->data, self, &self->mvp, self->pipeline, self->command_buffer);
     }
 
   vkCmdEndRenderPass (self->command_buffer);
index 60deaccf584bd9b064f8dea1846b01b1782e4413..d9582ca580cd31ea45d9b0408df45b4648b3b8f8 100644 (file)
@@ -211,12 +211,15 @@ gsk_vulkan_render_pass_reserve_descriptor_sets (GskVulkanRenderPass *self,
 }
 
 void
-gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
-                             GskVulkanRender     *render,
-                             GskVulkanPipeline   *pipeline,
-                             VkCommandBuffer      command_buffer)
+gsk_vulkan_render_pass_draw (GskVulkanRenderPass     *self,
+                             GskVulkanRender         *render,
+                             const graphene_matrix_t *root_mvp,
+                             GskVulkanPipeline       *pipeline,
+                             VkCommandBuffer          command_buffer)
 {
   GskVulkanRenderOp *op;
+  graphene_matrix_t world, mvp;
+  float float_matrix[16];
   guint i;
 
   for (i = 0; i < self->render_ops->len; i++)
@@ -234,6 +237,17 @@ gsk_vulkan_render_pass_draw (GskVulkanRenderPass *self,
                                0,
                                NULL);
 
+      gsk_render_node_get_world_matrix (op->node, &world);
+      graphene_matrix_multiply (&world, root_mvp, &mvp);
+      graphene_matrix_to_float (&mvp, float_matrix);
+
+      vkCmdPushConstants (command_buffer,
+                          gsk_vulkan_pipeline_get_pipeline_layout (pipeline),
+                          VK_SHADER_STAGE_VERTEX_BIT,
+                          0,
+                          sizeof (float_matrix),
+                          &float_matrix);
+
       vkCmdDraw (command_buffer,
                  op->vertex_count, 1,
                  op->vertex_offset, 0);
index a5eae7715c59c044e2d5771a1c66bc98c60bbad3..1cc826d588b4cf856bc5a34642bf713fba510f3a 100644 (file)
@@ -31,6 +31,7 @@ void                    gsk_vulkan_render_pass_reserve_descriptor_sets  (GskVulk
                                                                          GskVulkanRender        *render);
 void                    gsk_vulkan_render_pass_draw                     (GskVulkanRenderPass    *self,
                                                                          GskVulkanRender        *render,
+                                                                         const graphene_matrix_t*root_mvp,
                                                                          GskVulkanPipeline      *pipeline,
                                                                          VkCommandBuffer         command_buffer);